﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Tecnosop.Dominio;
using System.Data.SqlClient;
using Tecnosop.WebUI.Models;
using System.Web.UI;
using Tecnosop.WebUI.Infrastructure.Notification;

namespace Tecnosop.WebUI.Controllers
{
    [Authorize]
    public partial class ClienteController : Controller
    {
        private Entidades db = new Entidades();

        #region CRUD
        
        public virtual ViewResult Index()
        {
            var cliente = db.CLIENTE.Where(c => c.VISIBLE ?? false).Include(c => c.REGION1);
            return View(cliente.ToList());
        }

        public virtual ViewResult Details(string id)
        {
            CLIENTE cliente = db.CLIENTE.Find(id);
            //CLIENTE cliente = db.CLIENTE.Single(c => c.RUT_CLIENTE == id);
            return View(cliente);
        }

        public virtual ActionResult VerTodos()
        {
            var cliente = db.CLIENTE.Where(c => c.VISIBLE ?? false).Include(c => c.REGION1);
            return View(cliente.ToList());
        }

        public virtual ActionResult Create()
        {
            ViewBag.REGION = new SelectList(db.REGION, "REGION1", "REGION1");
            return View();
        }

        [HttpPost]
        public virtual ActionResult Create(CLIENTE cliente)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    cliente.VISIBLE = true;
                    db.CLIENTE.Add(cliente);
                    db.SaveChanges();

                    this.ShowMessage(MessageType.Success, "El cliente [" + cliente.NOMBRE + "] fue agregado exitosamente.");
                    return RedirectToAction(Actions.VerTodos());  
                }
                catch
                {
                    this.ShowMessage(MessageType.Error, "Ocurrió un error al intentar agregar el cliente.");
                    ViewBag.REGION = new SelectList(db.REGION, "REGION1", "REGION1", cliente.REGION);
                    return View(cliente);
                }
            }

            this.ShowMessage(MessageType.Warning, "Datos incorrectos, dañados o error durante su transmisión.");
            ViewBag.REGION = new SelectList(db.REGION, "REGION1", "REGION1", cliente.REGION);
            return View(cliente);
        }

        public virtual ActionResult Edit(string id)
        {
            CLIENTE cliente = db.CLIENTE.Find(id);

            ClienteViewModel c = new ClienteViewModel
            {
                RUT_CLIENTE = cliente.RUT_CLIENTE,
                NOMBRE = cliente.NOMBRE,
                DIRECCION = cliente.DIRECCION,
                EMAIL = cliente.EMAIL,
                REGION = cliente.REGION,
                COMUNA = cliente.COMUNA,
                CUIDAD = cliente.CUIDAD,
                TELEFONO_1 = cliente.TELEFONO_1,
                TELEFONO_2 = cliente.TELEFONO_2,
                GIRO = cliente.GIRO
            };

            ViewBag.REGION = new SelectList(db.REGION, "REGION1", "REGION1", cliente.REGION);
            return View(c);
        }

        [HttpPost]
        public virtual ActionResult Edit(ClienteViewModel cliente)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    CLIENTE c = db.CLIENTE.Find(cliente.RUT_CLIENTE);

                    c.NOMBRE = cliente.NOMBRE;
                    c.DIRECCION = cliente.DIRECCION;
                    c.EMAIL = cliente.EMAIL;
                    c.REGION = cliente.REGION;
                    c.COMUNA = cliente.COMUNA;
                    c.CUIDAD = cliente.CUIDAD;
                    c.TELEFONO_1 = cliente.TELEFONO_1;
                    c.TELEFONO_2 = cliente.TELEFONO_2;
                    c.GIRO = cliente.GIRO;

                    db.Entry(c).State = EntityState.Modified;
                    db.SaveChanges();

                    this.ShowMessage(MessageType.Success, "Cambios guardados correctamente.");
                    return RedirectToAction(Actions.Details(c.RUT_CLIENTE));
                }
                catch
                {
                    this.ShowMessage(MessageType.Error, "Ocurrió un error al intentar guardar los cambios para el cliente [" + cliente.NOMBRE + "].");
                    ViewBag.REGION = new SelectList(db.REGION, "REGION1", "REGION1", cliente.REGION);
                    return View(cliente);
                }
            }

            this.ShowMessage(MessageType.Warning, "Datos incorrectos, dañados o error durante su transmisión.");
            ViewBag.REGION = new SelectList(db.REGION, "REGION1", "REGION1", cliente.REGION);
            return View(cliente);
        }

        public virtual ActionResult Delete(string id)
        {
            CLIENTE cliente = db.CLIENTE.Find(id);
            this.ShowMessage(MessageType.Warning, "Está a punto de borrar el cliente [" + cliente.NOMBRE + "].", false);
            return View(cliente);
        }

        [HttpPost, ActionName("Delete")]
        public virtual ActionResult DeleteConfirmed(string id)
        {
            try
            {
                CLIENTE cliente = db.CLIENTE.Find(id);
                cliente.VISIBLE = false;

                db.Entry(cliente).State = EntityState.Modified;
                //db.CLIENTE.Remove(cliente);
                db.SaveChanges();
                this.ShowMessage(MessageType.Success, "El cliente fue eliminado exitosamente.");
                return RedirectToAction(Actions.VerTodos());
            }
            catch
            {
                this.ShowMessage(MessageType.Error, "Ocurrio un error al intentar eliminar el cliente.");
                return RedirectToAction(Actions.Delete(id));
            }
        }

        #endregion

        #region Validaciones

        [OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
        public virtual JsonResult ValidaRutUnico(string RUT_CLIENTE)
        {
            //try
            //{
            //    db.CLIENTE.Single(c => c.RUT_CLIENTE == RUT_CLIENTE);
            //    return Json(false, JsonRequestBehavior.AllowGet);
            //}
            //catch (InvalidOperationException)
            //{
            //    return Json(true, JsonRequestBehavior.AllowGet);
            //}
            return Json(!db.CLIENTE.Any(c => c.RUT_CLIENTE.Equals(RUT_CLIENTE)), JsonRequestBehavior.AllowGet);
        }

        [OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
        public virtual JsonResult ValidaBusquedaVacia(string Criterios, string AreaBusqueda)
        {
            switch (Criterios)
            {
                case "Rut":
                    return db.CLIENTE.Any(c => c.RUT_CLIENTE.Equals(AreaBusqueda)) ?
                        Json(true, JsonRequestBehavior.AllowGet) :
                        Json("No se encontraron clientes con el rut ingresado", JsonRequestBehavior.AllowGet);
                case "Nombre":
                    return db.CLIENTE.Any(c => c.NOMBRE.Contains(AreaBusqueda)) ?
                        Json(true, JsonRequestBehavior.AllowGet) :
                        Json("No se encontraron clientes que contengan \"" + AreaBusqueda + "\"", JsonRequestBehavior.AllowGet);
                case "Email":
                    return db.CLIENTE.Any(c => c.EMAIL.Contains(AreaBusqueda)) ?
                        Json(true, JsonRequestBehavior.AllowGet) :
                        Json("No se encontraron clientes que tengan \"" + AreaBusqueda + "\"", JsonRequestBehavior.AllowGet);
                default:
                    return Json("Criterio de búsqueda desconocido", JsonRequestBehavior.AllowGet);
            }
        }

        #endregion

        #region Busqueda

        [ChildActionOnly]
        public virtual ActionResult Search()
        {
            return PartialView();
        }

        public virtual ActionResult Busqueda()
        {
            return View();
        }

        public virtual ActionResult ResultadoBusqueda(string Criterios, string AreaBusqueda)
        {
            switch (Criterios)
            {
                case "Rut":
                    return View(new ResultadoBusquedaClienteViewModel
                    {
                        Resultado = db.CLIENTE.Where(c => c.RUT_CLIENTE.Equals(AreaBusqueda)).ToList(),
                        CriterioParaOrdenar = Criterios
                    });
                case "Nombre":
                    return View(new ResultadoBusquedaClienteViewModel
                    {
                        Resultado = db.CLIENTE.Where(c => c.NOMBRE.Contains(AreaBusqueda)).ToList(),
                        CriterioParaOrdenar = Criterios
                    });
                case "Email":
                    return View(new ResultadoBusquedaClienteViewModel
                    {
                        Resultado = db.CLIENTE.Where(c => c.EMAIL.Contains(AreaBusqueda)).ToList(),
                        CriterioParaOrdenar = Criterios
                    });
                default:
                    return PartialView(Views.Search);
            }
        }

        #endregion

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}